package effectiveJava;

import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

/**
 * Created by dycong on 2017/8/21.
 *todo 带有计数功能的 Set ,P73
 *todo 通过组合/包装的方式，拓展了set的功能，ForwardingSet使用了具体 Set 的实现类的方法API，并且不依赖其具体的实现细节，即使在新的jdk版本，实现方式改变了也不影响ForwardingSet的功能；
 *todo 复合的同时实现了接口 Set ，保证了ForwardingSet的兼容发行，用路很广，因为 Set 接口包存了Set的功能特性，除了获得健壮性之外，这种设计也带来了格外的灵活性。
 *todo 通过“复合的方式拓展现有类的功能”
 */
class ForwardingSet<E> {

    private final Set<E> s;

    public ForwardingSet(Set<E> s) {
        this.s = s;
    }

    public int size() {
        return s.size();
    }

    public boolean isEmpty() {
        return s.isEmpty();
    }

    public boolean contains(Object o) {
        return s.contains(o);
    }

    public Iterator<E> iterator() {
        return s.iterator();
    }

    public Object[] toArray() {
        return s.toArray();
    }

    public <T> T[] toArray(T[] a) {
        return s.toArray(a);
    }

    public boolean add(E e) {
        return s.add(e);
    }

    public boolean remove(Object o) {
        return s.remove(o);
    }

    public boolean containsAll(Collection<?> c) {
        return s.contains(c);
    }

    public boolean addAll(Collection<? extends E> c) {
        return s.addAll(c);
    }

    public boolean retainAll(Collection<?> c) {
        return s.retainAll(c);
    }

    public boolean removeAll(Collection<?> c) {
        return s.removeAll(c);
    }

    public void clear() {
        s.clear();
    }

    public boolean equals(Object o) {
        return s.equals(o);
    }

    public int hashCode() {
        return s.hashCode();
    }

}
